#include "TaskHandle.h"
#include "Base/SharedData.h"

#pragma pack(push, 8)
extern  "C"
{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
#include <iostream>
#pragma pack(pop)

// 方法一 ：函数注册
static int FunctionTest(lua_State *lua_state)
{
    // 获取参数个数
    const int count = lua_gettop(lua_state);
    int value {};
    for (int i = 0; i <= count; i++)
    {
        // 获取参数类型
        const int type = lua_type(lua_state, i);
        // 获取参数值
        value = lua_tonumber(lua_state, i);

        // 输出
        printf("index:%d, type:%d, value:%d\n", i, type, value);
    }
    lua_pushnumber(lua_state, value);
    return 1;
}

// 方法二：模块注册
static int FunctionModule(lua_State *lua_state)
{
    // 获取参数个数
    const int count = lua_gettop(lua_state);
    double avg {},sum{};
    for (int i = 0; i <= count; i++)
    {
        // 获取参数类型
        const int type = lua_type(lua_state, i);
        // 获取参数值
        const double value = lua_tonumber(lua_state, i);
        printf("index:%d, type:%d, value:%f\n", i, type, value);
        sum += value;
    }
    avg = sum / count;

    // 返回参数压入栈中
    lua_pushnumber(lua_state, avg);
    lua_pushnumber(lua_state, sum);
    // 返回的参数个数
    return 2;
}

// 列出需要注册的函数数组
static const luaL_Reg KRTS_FunctionModule[] =
{
    {"FunctionModule", FunctionModule},
    {nullptr, nullptr}
};

// 将所有函数放到表并压入栈中
int CreateLibs(lua_State *lua_state)
{
    // 创建一个表
    luaL_newlib(lua_state, KRTS_FunctionModule);
    return 1;
}

// 注册模块
static const luaL_Reg RegisterModule[] = {
    { "base", luaopen_base },   // 基础库
    { "KRTS", CreateLibs },     //自定义的模块名字：KRTS
    { nullptr, nullptr}
};


TaskHandle::TaskHandle()
{

}

TaskHandle::~TaskHandle() = default;

void TaskHandle::OnLuaScript()
{
    try
    {
        // 初始化
        lua_State *lua_state = luaL_newstate();
        // 加载lua库
        luaL_openlibs(lua_state);

        /****************************************************
         *    方法一： 以函数的形式注册C++普通函数提供给Lua使用
         *    C++方法： FunctionTest
         *    lua脚本：
         *             val = FunctionTest(10)
         *             print("The value is ", val)
         ****************************************************/

        /* 注册C++函数 */
        lua_register(lua_state, "FunctionTest", FunctionTest);

        /*****************************************************
        *    方法二： 以模块的方式注册C++普通函数提供给Lua使用
        *    C++模块： KRTS
        *       函数： FunctionModule
        *    lua脚本：
        *             avg,sum = KRTS.FunctionModule(1,2)
        *             print("The sum is ", sum)
        *             print("The avg is ", avg)
        *****************************************************/
        for (const luaL_Reg* lua_reg = RegisterModule; lua_reg->func; ++lua_reg)
        {
            luaL_requiref(lua_state, lua_reg->name, lua_reg->func, 1);
            lua_pop(lua_state, 1);
        }

        //luaL_dostring(lua_state, "print('hello lua')");
        // 执行lua文件
        luaL_dofile(lua_state, LUA_FILE_NAME);
        lua_close(lua_state);
    }
    catch (...)
    {
        printf("lua error\n");
    }
}

